package com.wl4g.devops.share.service.impl;

import com.wl4g.devops.share.config.FsProperties;
import com.wl4g.devops.share.service.FsService;
import com.wl4g.devops.tool.common.lang.Assert2;
import com.wl4g.devops.tool.common.lang.DateUtils2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;

@Service
public class FsServiceImpl implements FsService {

    @Autowired
    private FsProperties fsProperties;

    @Override
    public String uploadFile(MultipartFile file) {
        Date now = new Date();
        String fileName = file.getOriginalFilename();// 文件名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));// 后缀名
        fileName = UUID.randomUUID() + suffixName;// 新文件名
        fileName = "/" + DateUtils2.formatDate(now, "yyyyMMddHHmmss") + "/" + fileName;//加一级日期目录
        String path = fsProperties.getBaseFilePath() + fileName;
        saveFile(file, path);
        return fsProperties.getBaseFileUrl() + fileName;
    }

    @Override
    public ResponseEntity<FileSystemResource> downloadFile(String path) throws IOException {
        File file = new File(fsProperties.getBaseFilePath() + "/" + path);
        return downloadFile(file);
    }

    @Override
    public String uploadImg(MultipartFile img) {
        Date now = new Date();
        String fileName = img.getOriginalFilename();// 文件名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));// 后缀名

        String fileCode = UUID.randomUUID().toString().replaceAll("-", "");
        fileName = "/" + DateUtils2.formatDate(now, "yyyyMMddHHmmss") + "/" + fileCode + suffixName;

        saveFile(img, fsProperties.getBaseImgPath() + fileName);
        return fsProperties.getBaseImgUrl() + fileName;
    }

    @Override
    public byte[] downloadImg(String path) throws IOException {
        Assert2.hasTextOf(path, "path");
        File file = new File(fsProperties.getBaseImgPath() + path);
        if (!file.exists() || !file.isFile()) {
            return null;
        }
        FileInputStream inputStream = new FileInputStream(file);
        byte[] bytes = new byte[inputStream.available()];
        inputStream.read(bytes, 0, inputStream.available());
        return bytes;
    }

    private void saveFile(MultipartFile file, String localPath) {
        Assert.notNull(file, "文件为空");
        File dest = new File(localPath);
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }
        try {
            file.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private ResponseEntity<FileSystemResource> downloadFile(File file) {
        if (file == null) {
            return null;
        }
        if (!file.exists()) {
            return null;
        }
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        String suffixName = file.getName().substring(file.getName().lastIndexOf("."));// 后缀名
        headers.add("Content-Disposition", "attachment; filename=" + System.currentTimeMillis() + suffixName);
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        headers.add("Last-Modified", new Date().toString());
        headers.add("ETag", String.valueOf(System.currentTimeMillis()));

        return ResponseEntity.ok().headers(headers).contentLength(file.length())
                .contentType(MediaType.parseMediaType("application/octet-stream")).body(new FileSystemResource(file));
    }
}
